package com.emerquim.bean.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import javax.faces.model.SelectItem;

import org.apache.log4j.Logger;

/**
 * Clase para traer la informacion general de los eventos
 * de la base de datos
 * @author Felipe Criales
 */
public class DatosGeneralesEventoDAO {
	
	/**
	 * Funcionalidad de log
	 */
	private static final Logger log = Logger.getLogger(DatosGeneralesEventoDAO.class);

	// ---------------------------------------------
	// Constantes
	// ---------------------------------------------
	/**
	 * La constante para el sql de la lista de tipos de eventos
	 */
	public final static String SQL_TIPO_EVENTOS = "SELECT TEV_ID, TEV_DESC FROM P_TIPO_EVENTO ORDER BY TEV_ID ASC";
	
	/**
	 * La constante para el sql de la lista de los medios de comunicacion
	 */
	public final static String SQL_MEDIOS_COMUNICACION = "SELECT MCO_ID, MCO_DESC FROM P_MEDIO_COMUNICA ORDER BY MCO_ID ASC";
	
	/**
	 * La constante para el sql de la lista de los tipos de reportantes
	 */
	public final static String SQL_TIPOS_REPORTANTE = "SELECT TRE_ID, TRE_DESC FROM TIPO_REPORTA ORDER BY TRE_ID ASC";

	/**
	 * La constante para el sql de la lista de los tipos de documentos
	 */
	public final static String SQL_TIPOS_DOCUMENTO_IDETIFICACION = "SELECT TDO_ID, TDO_DESC FROM P_TIPO_DOCUMENTO ORDER BY TDO_ID ASC";

	/**
	 * La constante para el sql de la lista de los grupos etnicos
	 */
	public final static String SQL_TIPOS_GRUPOS_ETNICOS = "SELECT GRE_ID, GRE_DESC FROM P_GRUPO_ETNICO ORDER BY GRE_ID ASC";

	/**
	 * La constante para el sql de la lista de los grupos etnicos
	 */
	public final static String SQL_ESTADOS_FISICOS_AGENTE = "SELECT ESF_ID, ESF_DESC FROM P_ESTADO_FISICO ORDER BY ESF_ID ASC";
	
	/**
	 * La constante para el sql de la lista de tipos de emergencia para eventos de tipos toxicologicos
	 */
	public final static String SQL_TIPOS_EMERGENCIA = "SELECT TEM_ID, TEM_DESC FROM P_TIPOEMERGENCIA WHERE TEV_ID = 3 ORDER BY TEM_ID ASC";
	
	/**
	 * La constante para el sql de la lista de tipos de emergencia para eventos de tipos toxicologicos
	 */
	public final static String SQL_TIPOS_EMERGENCIA_TECNOLOGICOS = "SELECT TEM_ID, TEM_DESC FROM P_TIPOEMERGENCIA WHERE TEV_ID = 2 ORDER BY TEM_ID ASC";
		
	/**
	 * La constante para el sql de la lista de la actividad de la ocurrencia
	 */
	public final static String SQL_ACTIVIDAD_OCURRENCIA = "SELECT ACO_ID, ACO_DESC FROM P_ACT_OCURRENCIA ORDER BY ACO_ID ASC";
	
	/**
	 * La constante para el sql de la lista de los usos de los agentes
	 */
	public final static String SQL_USOS_AGENTES = "SELECT USO_ID, USO_DESC FROM P_USO ORDER BY USO_ID ASC";	
	
	/**
	 * La constante para el sql de la lista de las clases onu
	 */
	public final static String SQL_CLASE_ONU = "SELECT CLONU_ID, CLONU_DESC FROM P_CLASE_ONU ORDER BY CLONU_ID ASC";
	
	/**
	 * La constante para el sql de la lista de categorias toxicologicas
	 */
	public final static String SQL_CATEGORIAS_TOXICOLOGICAS = "SELECT CTX_ID, CTX_DESC FROM P_CAT_TOXICOLOGICA ORDER BY CTX_ID ASC";	
	
	/**
	 * La constante para el sql del grupo quimico de los agentes
	 */
	public final static String SQL_GRUPO_QUIMICO = "SELECT GRQ_ID, GRQ_DESC FROM P_GRUPO_QUIMICO ORDER BY GRQ_ID ASC";	
	
	/**
	 * La constante para el sql del grupo quimico de los agentes
	 */
	public final static String SQL_VIAS_INGRESO = "SELECT VII_ID, VII_DESC FROM P_VIAINGRESO ORDER BY VII_ID ASC";	
	
	/**
	 * La constante para el sql para los tipos de tratamientos disponibles para los pacientes
	 */
	public final static String SQL_TRATAMIENTOS = "SELECT TRA_ID, TRA_DESC FROM P_TRATAMIENTO ORDER BY TRA_ID ASC";	
	
	// ---------------------------------------------
	// Atributos
	// ---------------------------------------------
	/**
	 * La lista de los tipos de eventos
	 */
	private ArrayList<SelectItem> tipoEventos;
	
	/**
	 * La lista de los tipos de eventos
	 */
	private ArrayList<SelectItem> mediosComunicacion;
	
	/**
	 * La lista de los tipos de eventos
	 */
	private ArrayList<SelectItem> tipoReportante;
	
	/**
	 * La lista de los tipode s de documentos
	 */
	private ArrayList<SelectItem> tipoDocumentos;
	
	/**
	 * La lista de grupos etnicos
	 */
	private ArrayList<SelectItem> gruposEtnicos;	
	
	/**
	 * La lista de estadis fisicos de los agentes
	 */
	private ArrayList<SelectItem> estadosFisicosAgente;
	
	/**
	 * La lista de los tipos de emergencia
	 */
	private ArrayList<SelectItem> tiposEmergencia;
	
	/**
	 * La lista de los tipos de emergencia de tipo tecnologicos
	 */
	private ArrayList<SelectItem> tiposEmergenciaTecnologicos;
	
	/**
	 * La lista para el tipo de actividad de la ocurrencia
	 */
	private ArrayList<SelectItem> actividadOcurrencia;
	
	/**
	 * La lista para el uso del agente
	 */
	private ArrayList<SelectItem> usosAgente;
	
	/**
	 * La lista para las clases onu del agente
	 */
	private ArrayList<SelectItem> clasesOnuAgente;
	
	/**
	 * La lista para las categorias toxicologicas de los agentes
	 */
	private ArrayList<SelectItem> categoriasToxicologicas;
	
	/**
	 * La lista para los grupos quimicos del agente
	 */
	private ArrayList<SelectItem> gruposQuimicosAgente;
	
	/**
	 * La lista para los tipos de via de ingreso del agente
	 */
	private ArrayList<SelectItem> viasIngresoAgente;
	
	/**
	 * La lista para los tipos de via de ingreso del agente
	 */
	private ArrayList<SelectItem> tratamientosPaciente;
	
	/**
	 * Constructor de la clase
	 */
	public DatosGeneralesEventoDAO(){
		this.tipoEventos = this.getItemsBaseDatos(this.SQL_TIPO_EVENTOS, "TEV_ID", "TEV_DESC");
		this.mediosComunicacion = this.getItemsBaseDatos(this.SQL_MEDIOS_COMUNICACION, "MCO_ID", "MCO_DESC");	
		this.tipoReportante = this.getItemsBaseDatos(this.SQL_TIPOS_REPORTANTE, "TRE_ID", "TRE_DESC");
		this.tipoDocumentos = this.getItemsBaseDatos(this.SQL_TIPOS_DOCUMENTO_IDETIFICACION, "TDO_ID", "TDO_DESC");
		this.gruposEtnicos = this.getItemsBaseDatos(this.SQL_TIPOS_GRUPOS_ETNICOS, "GRE_ID", "GRE_DESC");
		this.estadosFisicosAgente = this.getItemsBaseDatos(this.SQL_ESTADOS_FISICOS_AGENTE, "ESF_ID", "ESF_DESC");
		this.tiposEmergencia = this.getItemsBaseDatos(this.SQL_TIPOS_EMERGENCIA, "TEM_ID", "TEM_DESC");
		this.tiposEmergenciaTecnologicos = this.getItemsBaseDatos(this.SQL_TIPOS_EMERGENCIA_TECNOLOGICOS, "TEM_ID", "TEM_DESC");
		this.actividadOcurrencia = this.getItemsBaseDatos(this.SQL_ACTIVIDAD_OCURRENCIA, "ACO_ID", "ACO_DESC");
		this.usosAgente = this.getItemsBaseDatos(this.SQL_USOS_AGENTES, "USO_ID", "USO_DESC");
		this.clasesOnuAgente = this.getItemsBaseDatos(this.SQL_CLASE_ONU, "CLONU_ID", "CLONU_DESC");
		this.categoriasToxicologicas = this.getItemsBaseDatos(this.SQL_CATEGORIAS_TOXICOLOGICAS, "CTX_ID", "CTX_DESC");
		this.gruposQuimicosAgente = this.getItemsBaseDatos(this.SQL_GRUPO_QUIMICO, "GRQ_ID", "GRQ_DESC");
		this.viasIngresoAgente = this.getItemsBaseDatos(this.SQL_VIAS_INGRESO, "VII_ID", "VII_DESC");
		this.tratamientosPaciente = this.getItemsBaseDatos(this.SQL_TRATAMIENTOS, "TRA_ID", "TRA_DESC");
	}
	
	/**
	 * Metodo que retonar una lista de items para los formularios
	 * dependiendo de la sentecia sql y de los datos de las columnas dadas
	 * Metodo Generico para llenar los combo box 
	 * @param sentenciaSQL La sentencia a ejecutar
	 * @param columnaId La columna del identificador
	 * @param columnaDesc La columna del descriptor
	 * @author Felipe Criales
	 */
	public ArrayList<SelectItem> getItemsBaseDatos(String sentenciaSQL, String columnaId, String columnaDesc) {
		ArrayList<SelectItem> listaItems = new ArrayList<SelectItem>();
		Connection conexion = null;
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;
		try {
			conexion = ConexionJDBC.getSingleton().getConnection();		
			preparedStatement = conexion.prepareStatement(sentenciaSQL);
			resultSet = preparedStatement.executeQuery();
			while (resultSet.next()) {
				int id = resultSet.getInt(columnaId);
				String descripcion = resultSet.getString(columnaDesc);
				listaItems.add(new SelectItem(id, descripcion));
			}			
		} catch (Exception e) {
			log.error("Error al listar los datos de la lista generica: " + sentenciaSQL);
			e.printStackTrace();
		}
		finally {
			ConexionJDBC.close(resultSet);
			ConexionJDBC.close(preparedStatement);	
			ConexionJDBC.close(conexion);
		}		
        return listaItems;
    }
	
	/**
	 * Metodo que construye el hastable para cargar los nombres de los nombres de documentos
	 * @author Felipe Criales
	 */
	public Map getNombresTiposDocumentos(){
		Map<Integer, String> nombresTipoIdentificacion = new HashMap<Integer, String>();		
		Connection conexion = null;
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;
		try {
			conexion = ConexionJDBC.getSingleton().getConnection();		
			preparedStatement = conexion.prepareStatement(this.SQL_TIPOS_DOCUMENTO_IDETIFICACION);
			resultSet = preparedStatement.executeQuery();
			while (resultSet.next()) {				
				int id = resultSet.getInt("TDO_ID");
				String descripcion = resultSet.getString("TDO_DESC");
				nombresTipoIdentificacion.put(id, descripcion);
			}			
		} catch (Exception e) {
			log.error("Error al listar los datos de los nombres de los tipos de documentos", e);
			e.printStackTrace();
		}
		finally {
			ConexionJDBC.close(resultSet);
			ConexionJDBC.close(preparedStatement);	
			ConexionJDBC.close(conexion);
		}		
		return nombresTipoIdentificacion;
	}
	
	/**
	 * Metodo que construye el hastable para cargar los nombres de los nombres de documentos
	 * @author Felipe Criales
	 */
	public Map getNombresTiposTratamientos(){
		Map<Integer, String> nombresTipoTratamientos = new HashMap<Integer, String>();		
		Connection conexion = null;
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;
		try {
			conexion = ConexionJDBC.getSingleton().getConnection();		
			preparedStatement = conexion.prepareStatement(this.SQL_TRATAMIENTOS);
			resultSet = preparedStatement.executeQuery();
			while (resultSet.next()) {				
				int id = resultSet.getInt("TRA_ID");
				String descripcion = resultSet.getString("TRA_DESC");
				nombresTipoTratamientos.put(id, descripcion);
			}			
		} catch (Exception e) {
			log.error("Error al listar los datos de los nombres de los tipos de tratamientos", e);
			e.printStackTrace();
		}
		finally {
			ConexionJDBC.close(resultSet);
			ConexionJDBC.close(preparedStatement);	
			ConexionJDBC.close(conexion);
		}		
		return nombresTipoTratamientos;
	}
	
	/**
	 * Retorna la lista de departamentos de la base de datos
	 * @author Felipe Criales
	 */
	public ArrayList<SelectItem> getTipoEventos() {
		return this.tipoEventos;		
    }
	
	/**
	 * Retorna la lista de los medios de comunicacion
	 * @author Felipe Criales
	 */
	public ArrayList<SelectItem> getMediosComunicacion() {
		return this.mediosComunicacion;		
    }
	
	/**
	 * Retorna la lista del tipo de reportante
	 * @author Felipe Criales
	 */
	public ArrayList<SelectItem> getTiposReportante() {
		return this.tipoReportante;		
    }	
	
	/**
	 * Retorna la lista del tipos de documentos
	 * @author Felipe Criales
	 */
	public ArrayList<SelectItem> getTiposDocumento() {
		return this.tipoDocumentos;		
    }	
	
	/**
	 * Retorna la lista de grupos etnicos
	 * @author Felipe Criales
	 */
	public ArrayList<SelectItem> getGruposEtnicos() {
		return this.gruposEtnicos;		
    }
	
	/**
	 * Retorna la lista de los estados fisicos del agente
	 * @author Felipe Criales
	 */
	public ArrayList<SelectItem> getEstadosFisicosAgente() {
		return this.estadosFisicosAgente;		
    }
	
	/**
	 * Retorna la lista de los tipos de emergencia
	 * @author Felipe Criales
	 */
	public ArrayList<SelectItem> getTiposEmergencia() {
		return this.tiposEmergencia;		
    }
	
	/**
	 * Retorna la lista de los tipos de emergencia de tipo tecnologicos
	 * @author Felipe Criales
	 */
	public ArrayList<SelectItem> getTiposEmergenciaTecnologicos() {
		return this.tiposEmergenciaTecnologicos;		
    }
	
	/**
	 * Retorna la lista para el tipo de actividad de la ocurrencia
	 * @author Felipe Criales
	 */
	public ArrayList<SelectItem> getActividadOcurrencia() {
		return this.actividadOcurrencia;		
    }

	/**
	 * Retorna la lista de usos de agentes
	 * @author Felipe Criales
	 */
	public ArrayList<SelectItem> getUsosAgente() {
		return usosAgente;
	}

	/**
	 * Retorna la lista de clases de agentes onu
	 * @author Felipe Criales
	 */
	public ArrayList<SelectItem> getClasesOnuAgente() {
		return clasesOnuAgente;
	}
	
	/**
	 * Retorna la lista de categorias toxicologicas
	 * @author Felipe Criales
	 */
	public ArrayList<SelectItem> getCategoriasToxicologicas() {
		return categoriasToxicologicas;
	}
	
	/**
	 * Retorna la lista de categorias toxicologicas
	 * @author Felipe Criales
	 */
	public ArrayList<SelectItem> getGrupoQuimicoAgente() {
		return gruposQuimicosAgente;
	}
	
	/**
	 * Retorna la lista de vias de ingreso del agente
	 * @author Felipe Criales
	 */
	public ArrayList<SelectItem> getViasIngresoAgente() {
		return viasIngresoAgente;
	}
	
	/**
	 * Retorna la lista de los tratamientos para los pacientes
	 * @author Felipe Criales
	 */
	public ArrayList<SelectItem> getTratamientosPaciente() {
		return tratamientosPaciente;
	}
}
